#############################################################################
# makefile
#
# Makefile pour la compilation d'un noyau pour Raspberry Pi.
#
# NOTE : utilise le script de linkage link_cmd.ld
#############################################################################


# Outils de la YAGARTO GNU ARM TOOLCHAIN
CC=arm-none-eabi

# Options communes à GAS et GCC
COMMON_FLAGS=-mcpu=arm1176jzf-s

# GCC C Flags
CFLAGS=-Wall -nostdlib -nostartfiles -ffreestanding -std=c99 -pedantic -O2 -fomit-frame-pointer

# Emplacement des fichiers sources
SOURCES_DIR=src/

# Répertoire contenant les fichiers objets intermédiaires
BUILD_DIR=build/

# Fichiers objets intermédiaires
C_OBJECTS=$(addsuffix .o,  $(addprefix $(BUILD_DIR), $(basename $(notdir $(wildcard $(SOURCES_DIR)*.c)))))
AS_OBJECTS=$(addsuffix .o,  $(addprefix $(BUILD_DIR), $(basename $(notdir $(wildcard $(SOURCES_DIR)*.s)))))

# Image du noyau à générer
TARGET=kernel.img

# Fichier binaire ELF intermédiaire
ELF_BIN=$(BUILD_DIR)kernel.elf

# Fichier de commande pour le linkage
LD_SCRIPT=link_cmd.ld

# Fichier contenant des informations sur le linkage (link map)
LINK_MAP=mapfile.map

# Fichier contenant des informations sur le fichier binaire ELF du noyau
BIN_LIST=kernel.list

all: $(TARGET) $(BIN_LIST)

# Règle pour la création du l'image du noyau finale
$(TARGET): $(ELF_BIN)
	$(CC)-objcopy $^ -O binary $@

# Règle pour la création du fichier binaire ELF intermédiaire
$(ELF_BIN): $(C_OBJECTS) $(AS_OBJECTS)
	$(CC)-ld -Map $(LINK_MAP) $^ -o $@ -T $(LD_SCRIPT)

# Règle pour la création des fichiers objets intermédiaires .o à partir des fichiers C
$(BUILD_DIR)%.o: $(SOURCES_DIR)%.c
	$(CC)-gcc $(COMMON_FLAGS) $(CFLAGS) $< -c -o $@

# Règle pour la création des fichiers objets intermédiaires .o à partir des fichiers ASM
$(BUILD_DIR)%.o: $(SOURCES_DIR)%.s
	$(CC)-as $(COMMON_FLAGS) -I $(SOURCES_DIR) $< -c -o $@

# Règle pour générer le fichier d'infos list
$(BIN_LIST) : $(ELF_BIN)
	$(CC)-objdump -D $^ > $(BIN_LIST)

# Règle de rebuild
rebuild: all

# Règles de nettyage
# Efface les fichiers intermédiaires
clean:
		rm -f $(BUILD_DIR)*.o
		rm -f $(ELF_BIN)
		rm -f $(LINK_MAP)
		rm -f $(BIN_LIST)

# Efface tout : fichiers intermédiaires et finaux
mrproper:
	make clean
	rm -f $(TARGET)
